package org.bonorsoft.modules.system.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.bonorsoft.common.api.vo.Result;
import org.bonorsoft.modules.system.entity.SysUser;
import org.bonorsoft.modules.user.entity.Params;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * @Description: 用户信息
 * @Author: WilliamYe
 * @Date:   2020-08-20
 * @Version: V1.0
 */
public interface ISysUserService extends IService<SysUser>{

    public SysUser getUserByName(String username);

    /**
     * 校验用户是否有效
     * @param sysUser
     * @return
     */
    Result<JSONObject> checkUserIsEffective(SysUser sysUser);

    /**
     * 根据用户名设置部门ID
     * @param username
     * @param deptId
     */
    void updateUserDepart(String username,Long deptId);

    /**
     * 根据菜单id获取全部用户userid
     * @param menuId
     * @return
     */
    List<String> getAllMenuUser(Long menuId);

    /**
     * 根据角色id获取全部用户userid
     * @param roleId
     * @return
     */
    List<String> getAllRoleUser(String roleId);

    IPage<SysUser> selectUser(Page<SysUser> page, SysUser sysUser, Params params, HttpServletRequest request);

    /**
     * 根据角色id查询用户
     * @param page
     * @param user
     * @param req
     * @return
     */
    IPage<SysUser> pageByConditions(Page<SysUser> page, SysUser user, HttpServletRequest req);

    /**
     * 查询部门是否存在用户
     * @param deptId
     * @return
     */
    int checkDeptExistUser(Long deptId);


    /**
     * 校验用户名称是否唯一
     *
     * @param username 登录名称
     * @return 结果
     */
    public String checkUserNameUnique(String username);

    /**
     * 校验手机号码是否唯一
     *
     * @param user 用户信息
     * @return 结果
     */
    public String checkPhoneUnique(SysUser user);


    /**
     * 插入一条记录（选择字段，策略插入）
     *
     * @param user 实体对象
     */
    boolean save(SysUser user, String[] roleIds);

    boolean add(SysUser user,String[] roleIds);

    /**
     * 校验用户是否允许操作
     *
     * @param user 用户信息
     */
    void checkUserAllowed(SysUser user);

    /**
     * 编辑用户信息
     * @param user 用户信息
     * @return
     */
    boolean updateUser(SysUser user, String[] roleIds);

    /**
     * 删除（根据ID 批量删除）
     *
     * @param idList 主键ID列表
     */
    boolean removeByIds(Collection<? extends Serializable> idList);

    /**
     * 修改密码
     *
     * @param sysUser
     * @return
     */
    public Result<?> changePassword(SysUser sysUser);

    /**
     * 用户授权角色
     *
     * @param userId 用户ID
     * @param roleIds 角色组
     */
    void insertUserAuth(String userId, String[] roleIds);

    /**
     * 更新用戶，并且更新redis中的缓存信息
     * @param sysUser
     * @return
     */
    boolean updateByUser(SysUser sysUser);

    /**
     * 根据手机号获取用户
     * @param phone
     * @return
     */
    SysUser getUserByPhone(String phone);

    /**
     * 微信小程序，校验用户是否有效
     * @param sysUser
     * @param phone
     * @return
     */
    Result<JSONObject> checkUserIsEffectiveWithWx(SysUser sysUser, String phone);
}
